﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using static HBSharp;

public static class HBSharp
{
    //将HBSharp的接口导出到c#

    const string dll_harffbuzz = "hb_custom";//自己编译的，控制导出，容量小，无依赖
    //const string dll_harffbuzz = "libharfbuzz-0";//官方下载，依赖太多了
    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    public static extern IntPtr hb_version_string();

    public struct HB_Blob
    {
        public IntPtr ptr;
    }
    public enum hb_memory_mode
    {
        HB_MEMORY_MODE_DUPLICATE,
        HB_MEMORY_MODE_READONLY,
        HB_MEMORY_MODE_WRITABLE,
        HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE
    }
    ;

    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    public static extern HB_Blob hb_blob_create(IntPtr mem, uint length, hb_memory_mode mode, IntPtr USer_data, IntPtr destroy);

    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    public static extern HB_Blob hb_blob_create_from_file(string file_name);

    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    public static extern void hb_blob_destroy(HB_Blob blob);

    public struct HB_Face
    {
        public IntPtr ptr;
    }



    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    public static extern uint hb_face_count(HB_Blob blob);

    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    public static extern HB_Face hb_face_create(HB_Blob blob, uint index);

    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    public static extern void hb_face_destroy(HB_Face face);

    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    public static extern uint hb_face_get_glyph_count(HB_Face face);

    public struct HB_Font
    {
        public IntPtr ptr;
    }

    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    public static extern HB_Font hb_font_create(HB_Face face);
    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    public static extern void hb_font_destroy(HB_Font font);
    public struct HB_Buffer
    {
        public IntPtr ptr;
    }
    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    public static extern HB_Buffer hb_buffer_create();
    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    public static extern void hb_buffer_destroy(HB_Buffer buffer);
    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    public static extern void hb_buffer_reset(HB_Buffer buffer);

    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    unsafe public static extern void hb_buffer_add_utf8(HB_Buffer buffer, byte* ptr, int text_length, uint item_offset, int item_length);

    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    unsafe public static extern void hb_buffer_add_utf16(HB_Buffer buffer, UInt16* ptr, int text_length, uint item_offset, int item_length);

    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    unsafe public static extern void hb_buffer_add_utf32(HB_Buffer buffer, UInt32* ptr, int text_length, uint item_offset, int item_length);

    public enum hb_direction
    {
        HB_DIRECTION_INVALID = 0,
        HB_DIRECTION_LTR = 4,
        HB_DIRECTION_RTL,
        HB_DIRECTION_TTB,
        HB_DIRECTION_BTT
    }
    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    unsafe public static extern hb_direction hb_buffer_get_direction(HB_Buffer buffer);
    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    unsafe public static extern uint hb_buffer_get_length(HB_Buffer buffer);

    public struct hb_glyph_info
    {
        public UInt32 codepoint;
        /*< private >*/
        public UInt32 mask;
        /*< public >*/
        public UInt32 cluster;

        /*< private >*/
        public UInt32 var1;
        public UInt32 var2;
        public override string ToString()
        {
            return codepoint + ":" + mask + ":" + cluster;
        }
    }
    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    unsafe public static extern hb_glyph_info* hb_buffer_get_glyph_infos(HB_Buffer buffer, out uint length);

    public struct hb_glyph_position_t
    {
        public int x_advance;
        public int y_advance;
        public int x_offset;
        public int y_offset;

        /*< private >*/
        public UInt32 var;
        public override string ToString()
        {
            return x_advance + "," + y_advance;
        }
    }

    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    unsafe public static extern hb_glyph_position_t* hb_buffer_get_glyph_positions(HB_Buffer buffer, out uint length);

    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    unsafe public static extern void hb_buffer_guess_segment_properties(HB_Buffer buffer);
    //shape
    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    public static extern void hb_shape(HB_Font font, HB_Buffer buffer, IntPtr features, uint num_features);

    static uint HB_TAG(byte c1, byte c2, byte c3, byte c4)
    {
        return ((uint)((((uint)(c1) & 0xFF) << 24) | (((uint)(c2) & 0xFF) << 16) | (((uint)(c3) & 0xFF) << 8) | ((uint)(c4) & 0xFF)));

    }
    static uint HB_TAG(char b1, char b2, char b3, char b4)
    {
        return HB_TAG((byte)b1, (byte)b2, (byte)b3, (byte)b4);
    }
    static readonly uint HB_TAG_MAX_SIGNED = HB_TAG(0x7f, 0xff, 0xff, 0xff);
    static readonly uint HB_TAG_NONE = HB_TAG(0, 0, 0, 0);

    static readonly uint HB_TAG_MAX = HB_TAG(0xff, 0xff, 0xff, 0xff);
    public static readonly uint HB_SCRIPT_COMMON = HB_TAG('Z', 'y', 'y', 'y'), /*1.1*/
         HB_SCRIPT_INHERITED = HB_TAG('Z', 'i', 'n', 'h'), /*1.1*/
         HB_SCRIPT_UNKNOWN = HB_TAG('Z', 'z', 'z', 'z'), /*5.0*/

         HB_SCRIPT_ARABIC = HB_TAG('A', 'r', 'a', 'b'), /*1.1*/
         HB_SCRIPT_ARMENIAN = HB_TAG('A', 'r', 'm', 'n'), /*1.1*/
         HB_SCRIPT_BENGALI = HB_TAG('B', 'e', 'n', 'g'), /*1.1*/
         HB_SCRIPT_CYRILLIC = HB_TAG('C', 'y', 'r', 'l'), /*1.1*/
         HB_SCRIPT_DEVANAGARI = HB_TAG('D', 'e', 'v', 'a'), /*1.1*/
         HB_SCRIPT_GEORGIAN = HB_TAG('G', 'e', 'o', 'r'), /*1.1*/
         HB_SCRIPT_GREEK = HB_TAG('G', 'r', 'e', 'k'), /*1.1*/
         HB_SCRIPT_GUJARATI = HB_TAG('G', 'u', 'j', 'r'), /*1.1*/
         HB_SCRIPT_GURMUKHI = HB_TAG('G', 'u', 'r', 'u'), /*1.1*/
         HB_SCRIPT_HANGUL = HB_TAG('H', 'a', 'n', 'g'), /*1.1*/
         HB_SCRIPT_HAN = HB_TAG('H', 'a', 'n', 'i'), /*1.1*/
         HB_SCRIPT_HEBREW = HB_TAG('H', 'e', 'b', 'r'), /*1.1*/
         HB_SCRIPT_HIRAGANA = HB_TAG('H', 'i', 'r', 'a'), /*1.1*/
         HB_SCRIPT_KANNADA = HB_TAG('K', 'n', 'd', 'a'), /*1.1*/
         HB_SCRIPT_KATAKANA = HB_TAG('K', 'a', 'n', 'a'), /*1.1*/
         HB_SCRIPT_LAO = HB_TAG('L', 'a', 'o', 'o'), /*1.1*/
         HB_SCRIPT_LATIN = HB_TAG('L', 'a', 't', 'n'), /*1.1*/
         HB_SCRIPT_MALAYALAM = HB_TAG('M', 'l', 'y', 'm'), /*1.1*/
         HB_SCRIPT_ORIYA = HB_TAG('O', 'r', 'y', 'a'), /*1.1*/
         HB_SCRIPT_TAMIL = HB_TAG('T', 'a', 'm', 'l'), /*1.1*/
         HB_SCRIPT_TELUGU = HB_TAG('T', 'e', 'l', 'u'), /*1.1*/
         HB_SCRIPT_THAI = HB_TAG('T', 'h', 'a', 'i'), /*1.1*/

         HB_SCRIPT_TIBETAN = HB_TAG('T', 'i', 'b', 't'), /*2.0*/

         HB_SCRIPT_BOPOMOFO = HB_TAG('B', 'o', 'p', 'o'), /*3.0*/
         HB_SCRIPT_BRAILLE = HB_TAG('B', 'r', 'a', 'i'), /*3.0*/
         HB_SCRIPT_CANADIAN_SYLLABICS = HB_TAG('C', 'a', 'n', 's'), /*3.0*/
         HB_SCRIPT_CHEROKEE = HB_TAG('C', 'h', 'e', 'r'), /*3.0*/
         HB_SCRIPT_ETHIOPIC = HB_TAG('E', 't', 'h', 'i'), /*3.0*/
         HB_SCRIPT_KHMER = HB_TAG('K', 'h', 'm', 'r'), /*3.0*/
         HB_SCRIPT_MONGOLIAN = HB_TAG('M', 'o', 'n', 'g'), /*3.0*/
         HB_SCRIPT_MYANMAR = HB_TAG('M', 'y', 'm', 'r'), /*3.0*/
         HB_SCRIPT_OGHAM = HB_TAG('O', 'g', 'a', 'm'), /*3.0*/
         HB_SCRIPT_RUNIC = HB_TAG('R', 'u', 'n', 'r'), /*3.0*/
         HB_SCRIPT_SINHALA = HB_TAG('S', 'i', 'n', 'h'), /*3.0*/
         HB_SCRIPT_SYRIAC = HB_TAG('S', 'y', 'r', 'c'), /*3.0*/
         HB_SCRIPT_THAANA = HB_TAG('T', 'h', 'a', 'a'), /*3.0*/
         HB_SCRIPT_YI = HB_TAG('Y', 'i', 'i', 'i'), /*3.0*/

         HB_SCRIPT_DESERET = HB_TAG('D', 's', 'r', 't'), /*3.1*/
         HB_SCRIPT_GOTHIC = HB_TAG('G', 'o', 't', 'h'), /*3.1*/
         HB_SCRIPT_OLD_ITALIC = HB_TAG('I', 't', 'a', 'l'), /*3.1*/

         HB_SCRIPT_BUHID = HB_TAG('B', 'u', 'h', 'd'), /*3.2*/
         HB_SCRIPT_HANUNOO = HB_TAG('H', 'a', 'n', 'o'), /*3.2*/
         HB_SCRIPT_TAGALOG = HB_TAG('T', 'g', 'l', 'g'), /*3.2*/
         HB_SCRIPT_TAGBANWA = HB_TAG('T', 'a', 'g', 'b'), /*3.2*/

         HB_SCRIPT_CYPRIOT = HB_TAG('C', 'p', 'r', 't'), /*4.0*/
         HB_SCRIPT_LIMBU = HB_TAG('L', 'i', 'm', 'b'), /*4.0*/
         HB_SCRIPT_LINEAR_B = HB_TAG('L', 'i', 'n', 'b'), /*4.0*/
         HB_SCRIPT_OSMANYA = HB_TAG('O', 's', 'm', 'a'), /*4.0*/
         HB_SCRIPT_SHAVIAN = HB_TAG('S', 'h', 'a', 'w'), /*4.0*/
         HB_SCRIPT_TAI_LE = HB_TAG('T', 'a', 'l', 'e'), /*4.0*/
         HB_SCRIPT_UGARITIC = HB_TAG('U', 'g', 'a', 'r'), /*4.0*/

         HB_SCRIPT_BUGINESE = HB_TAG('B', 'u', 'g', 'i'), /*4.1*/
         HB_SCRIPT_COPTIC = HB_TAG('C', 'o', 'p', 't'), /*4.1*/
         HB_SCRIPT_GLAGOLITIC = HB_TAG('G', 'l', 'a', 'g'), /*4.1*/
         HB_SCRIPT_KHAROSHTHI = HB_TAG('K', 'h', 'a', 'r'), /*4.1*/
         HB_SCRIPT_NEW_TAI_LUE = HB_TAG('T', 'a', 'l', 'u'), /*4.1*/
         HB_SCRIPT_OLD_PERSIAN = HB_TAG('X', 'p', 'e', 'o'), /*4.1*/
         HB_SCRIPT_SYLOTI_NAGRI = HB_TAG('S', 'y', 'l', 'o'), /*4.1*/
         HB_SCRIPT_TIFINAGH = HB_TAG('T', 'f', 'n', 'g'), /*4.1*/

         HB_SCRIPT_BALINESE = HB_TAG('B', 'a', 'l', 'i'), /*5.0*/
         HB_SCRIPT_CUNEIFORM = HB_TAG('X', 's', 'u', 'x'), /*5.0*/
         HB_SCRIPT_NKO = HB_TAG('N', 'k', 'o', 'o'), /*5.0*/
         HB_SCRIPT_PHAGS_PA = HB_TAG('P', 'h', 'a', 'g'), /*5.0*/
         HB_SCRIPT_PHOENICIAN = HB_TAG('P', 'h', 'n', 'x'), /*5.0*/

         HB_SCRIPT_CARIAN = HB_TAG('C', 'a', 'r', 'i'), /*5.1*/
         HB_SCRIPT_CHAM = HB_TAG('C', 'h', 'a', 'm'), /*5.1*/
         HB_SCRIPT_KAYAH_LI = HB_TAG('K', 'a', 'l', 'i'), /*5.1*/
         HB_SCRIPT_LEPCHA = HB_TAG('L', 'e', 'p', 'c'), /*5.1*/
         HB_SCRIPT_LYCIAN = HB_TAG('L', 'y', 'c', 'i'), /*5.1*/
         HB_SCRIPT_LYDIAN = HB_TAG('L', 'y', 'd', 'i'), /*5.1*/
         HB_SCRIPT_OL_CHIKI = HB_TAG('O', 'l', 'c', 'k'), /*5.1*/
         HB_SCRIPT_REJANG = HB_TAG('R', 'j', 'n', 'g'), /*5.1*/
         HB_SCRIPT_SAURASHTRA = HB_TAG('S', 'a', 'u', 'r'), /*5.1*/
         HB_SCRIPT_SUNDANESE = HB_TAG('S', 'u', 'n', 'd'), /*5.1*/
         HB_SCRIPT_VAI = HB_TAG('V', 'a', 'i', 'i'), /*5.1*/

         HB_SCRIPT_AVESTAN = HB_TAG('A', 'v', 's', 't'), /*5.2*/
         HB_SCRIPT_BAMUM = HB_TAG('B', 'a', 'm', 'u'), /*5.2*/
         HB_SCRIPT_EGYPTIAN_HIEROGLYPHS = HB_TAG('E', 'g', 'y', 'p'), /*5.2*/
         HB_SCRIPT_IMPERIAL_ARAMAIC = HB_TAG('A', 'r', 'm', 'i'), /*5.2*/
         HB_SCRIPT_INSCRIPTIONAL_PAHLAVI = HB_TAG('P', 'h', 'l', 'i'), /*5.2*/
         HB_SCRIPT_INSCRIPTIONAL_PARTHIAN = HB_TAG('P', 'r', 't', 'i'), /*5.2*/
         HB_SCRIPT_JAVANESE = HB_TAG('J', 'a', 'v', 'a'), /*5.2*/
         HB_SCRIPT_KAITHI = HB_TAG('K', 't', 'h', 'i'), /*5.2*/
         HB_SCRIPT_LISU = HB_TAG('L', 'i', 's', 'u'), /*5.2*/
         HB_SCRIPT_MEETEI_MAYEK = HB_TAG('M', 't', 'e', 'i'), /*5.2*/
         HB_SCRIPT_OLD_SOUTH_ARABIAN = HB_TAG('S', 'a', 'r', 'b'), /*5.2*/
         HB_SCRIPT_OLD_TURKIC = HB_TAG('O', 'r', 'k', 'h'), /*5.2*/
         HB_SCRIPT_SAMARITAN = HB_TAG('S', 'a', 'm', 'r'), /*5.2*/
         HB_SCRIPT_TAI_THAM = HB_TAG('L', 'a', 'n', 'a'), /*5.2*/
         HB_SCRIPT_TAI_VIET = HB_TAG('T', 'a', 'v', 't'), /*5.2*/

         HB_SCRIPT_BATAK = HB_TAG('B', 'a', 't', 'k'), /*6.0*/
         HB_SCRIPT_BRAHMI = HB_TAG('B', 'r', 'a', 'h'), /*6.0*/
         HB_SCRIPT_MANDAIC = HB_TAG('M', 'a', 'n', 'd'), /*6.0*/

         HB_SCRIPT_CHAKMA = HB_TAG('C', 'a', 'k', 'm'), /*6.1*/
         HB_SCRIPT_MEROITIC_CURSIVE = HB_TAG('M', 'e', 'r', 'c'), /*6.1*/
         HB_SCRIPT_MEROITIC_HIEROGLYPHS = HB_TAG('M', 'e', 'r', 'o'), /*6.1*/
         HB_SCRIPT_MIAO = HB_TAG('P', 'l', 'r', 'd'), /*6.1*/
         HB_SCRIPT_SHARADA = HB_TAG('S', 'h', 'r', 'd'), /*6.1*/
         HB_SCRIPT_SORA_SOMPENG = HB_TAG('S', 'o', 'r', 'a'), /*6.1*/
         HB_SCRIPT_TAKRI = HB_TAG('T', 'a', 'k', 'r'), /*6.1*/

         /*
          * Since: 0.9.30
          */
         HB_SCRIPT_BASSA_VAH = HB_TAG('B', 'a', 's', 's'), /*7.0*/
         HB_SCRIPT_CAUCASIAN_ALBANIAN = HB_TAG('A', 'g', 'h', 'b'), /*7.0*/
         HB_SCRIPT_DUPLOYAN = HB_TAG('D', 'u', 'p', 'l'), /*7.0*/
         HB_SCRIPT_ELBASAN = HB_TAG('E', 'l', 'b', 'a'), /*7.0*/
         HB_SCRIPT_GRANTHA = HB_TAG('G', 'r', 'a', 'n'), /*7.0*/
         HB_SCRIPT_KHOJKI = HB_TAG('K', 'h', 'o', 'j'), /*7.0*/
         HB_SCRIPT_KHUDAWADI = HB_TAG('S', 'i', 'n', 'd'), /*7.0*/
         HB_SCRIPT_LINEAR_A = HB_TAG('L', 'i', 'n', 'a'), /*7.0*/
         HB_SCRIPT_MAHAJANI = HB_TAG('M', 'a', 'h', 'j'), /*7.0*/
         HB_SCRIPT_MANICHAEAN = HB_TAG('M', 'a', 'n', 'i'), /*7.0*/
         HB_SCRIPT_MENDE_KIKAKUI = HB_TAG('M', 'e', 'n', 'd'), /*7.0*/
         HB_SCRIPT_MODI = HB_TAG('M', 'o', 'd', 'i'), /*7.0*/
         HB_SCRIPT_MRO = HB_TAG('M', 'r', 'o', 'o'), /*7.0*/
         HB_SCRIPT_NABATAEAN = HB_TAG('N', 'b', 'a', 't'), /*7.0*/
         HB_SCRIPT_OLD_NORTH_ARABIAN = HB_TAG('N', 'a', 'r', 'b'), /*7.0*/
         HB_SCRIPT_OLD_PERMIC = HB_TAG('P', 'e', 'r', 'm'), /*7.0*/
         HB_SCRIPT_PAHAWH_HMONG = HB_TAG('H', 'm', 'n', 'g'), /*7.0*/
         HB_SCRIPT_PALMYRENE = HB_TAG('P', 'a', 'l', 'm'), /*7.0*/
         HB_SCRIPT_PAU_CIN_HAU = HB_TAG('P', 'a', 'u', 'c'), /*7.0*/
         HB_SCRIPT_PSALTER_PAHLAVI = HB_TAG('P', 'h', 'l', 'p'), /*7.0*/
         HB_SCRIPT_SIDDHAM = HB_TAG('S', 'i', 'd', 'd'), /*7.0*/
         HB_SCRIPT_TIRHUTA = HB_TAG('T', 'i', 'r', 'h'), /*7.0*/
         HB_SCRIPT_WARANG_CITI = HB_TAG('W', 'a', 'r', 'a'), /*7.0*/

         HB_SCRIPT_AHOM = HB_TAG('A', 'h', 'o', 'm'), /*8.0*/
         HB_SCRIPT_ANATOLIAN_HIEROGLYPHS = HB_TAG('H', 'l', 'u', 'w'), /*8.0*/
         HB_SCRIPT_HATRAN = HB_TAG('H', 'a', 't', 'r'), /*8.0*/
         HB_SCRIPT_MULTANI = HB_TAG('M', 'u', 'l', 't'), /*8.0*/
         HB_SCRIPT_OLD_HUNGARIAN = HB_TAG('H', 'u', 'n', 'g'), /*8.0*/
         HB_SCRIPT_SIGNWRITING = HB_TAG('S', 'g', 'n', 'w'), /*8.0*/

         /*
          * Since 1.3.0
          */
         HB_SCRIPT_ADLAM = HB_TAG('A', 'd', 'l', 'm'), /*9.0*/
         HB_SCRIPT_BHAIKSUKI = HB_TAG('B', 'h', 'k', 's'), /*9.0*/
         HB_SCRIPT_MARCHEN = HB_TAG('M', 'a', 'r', 'c'), /*9.0*/
         HB_SCRIPT_OSAGE = HB_TAG('O', 's', 'g', 'e'), /*9.0*/
         HB_SCRIPT_TANGUT = HB_TAG('T', 'a', 'n', 'g'), /*9.0*/
         HB_SCRIPT_NEWA = HB_TAG('N', 'e', 'w', 'a'), /*9.0*/

         /*
          * Since 1.6.0
          */
         HB_SCRIPT_MASARAM_GONDI = HB_TAG('G', 'o', 'n', 'm'), /*10.0*/
         HB_SCRIPT_NUSHU = HB_TAG('N', 's', 'h', 'u'), /*10.0*/
         HB_SCRIPT_SOYOMBO = HB_TAG('S', 'o', 'y', 'o'), /*10.0*/
         HB_SCRIPT_ZANABAZAR_SQUARE = HB_TAG('Z', 'a', 'n', 'b'), /*10.0*/

         /*
          * Since 1.8.0
          */
         HB_SCRIPT_DOGRA = HB_TAG('D', 'o', 'g', 'r'), /*11.0*/
         HB_SCRIPT_GUNJALA_GONDI = HB_TAG('G', 'o', 'n', 'g'), /*11.0*/
         HB_SCRIPT_HANIFI_ROHINGYA = HB_TAG('R', 'o', 'h', 'g'), /*11.0*/
         HB_SCRIPT_MAKASAR = HB_TAG('M', 'a', 'k', 'a'), /*11.0*/
         HB_SCRIPT_MEDEFAIDRIN = HB_TAG('M', 'e', 'd', 'f'), /*11.0*/
         HB_SCRIPT_OLD_SOGDIAN = HB_TAG('S', 'o', 'g', 'o'), /*11.0*/
         HB_SCRIPT_SOGDIAN = HB_TAG('S', 'o', 'g', 'd'), /*11.0*/

         /*
          * Since 2.4.0
          */
         HB_SCRIPT_ELYMAIC = HB_TAG('E', 'l', 'y', 'm'), /*12.0*/
         HB_SCRIPT_NANDINAGARI = HB_TAG('N', 'a', 'n', 'd'), /*12.0*/
         HB_SCRIPT_NYIAKENG_PUACHUE_HMONG = HB_TAG('H', 'm', 'n', 'p'), /*12.0*/
         HB_SCRIPT_WANCHO = HB_TAG('W', 'c', 'h', 'o'), /*12.0*/

         /*
          * Since 2.6.7
          */
         HB_SCRIPT_CHORASMIAN = HB_TAG('C', 'h', 'r', 's'), /*13.0*/
         HB_SCRIPT_DIVES_AKURU = HB_TAG('D', 'i', 'a', 'k'), /*13.0*/
         HB_SCRIPT_KHITAN_SMALL_SCRIPT = HB_TAG('K', 'i', 't', 's'), /*13.0*/
         HB_SCRIPT_YEZIDI = HB_TAG('Y', 'e', 'z', 'i'), /*13.0*/

         /*
          * Since 3.0.0
          */
         HB_SCRIPT_CYPRO_MINOAN = HB_TAG('C', 'p', 'm', 'n'), /*14.0*/
         HB_SCRIPT_OLD_UYGHUR = HB_TAG('O', 'u', 'g', 'r'), /*14.0*/
         HB_SCRIPT_TANGSA = HB_TAG('T', 'n', 's', 'a'), /*14.0*/
         HB_SCRIPT_TOTO = HB_TAG('T', 'o', 't', 'o'), /*14.0*/
         HB_SCRIPT_VITHKUQI = HB_TAG('V', 'i', 't', 'h'), /*14.0*/

         /*
          * Since 3.4.0
          */
         HB_SCRIPT_MATH = HB_TAG('Z', 'm', 't', 'h'),

         /*
          * Since 5.2.0
          */
         HB_SCRIPT_KAWI = HB_TAG('K', 'a', 'w', 'i'), /*15.0*/
         HB_SCRIPT_NAG_MUNDARI = HB_TAG('N', 'a', 'g', 'm'), /*15.0*/

         /* No script set. */
         HB_SCRIPT_INVALID = HB_TAG_NONE,

         /*< private >*/

         /* Dummy values to ensure any hb_tag_t value can be passed/stored as hb_script_t
          * without risking undefined behavior.  We have two, for historical reasons.
          * HB_TAG_MAX used to be unsigned, but that was invalid Ansi C, so was changed
          * to _HB_SCRIPT_MAX_VALUE to be equal to HB_TAG_MAX_SIGNED as well.
          *
          * See this thread for technicalities:
          *
          *   https://lists.freedesktop.org/archives/harfbuzz/2014-March/004150.html
          */
         _HB_SCRIPT_MAX_VALUE = HB_TAG_MAX_SIGNED, /*< skip >*/
         _HB_SCRIPT_MAX_VALUE_SIGNED = HB_TAG_MAX_SIGNED /*< skip >*/

         ;

    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]

    public static extern void hb_buffer_set_script(HB_Buffer buffer, uint script);

    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]

    public static extern void hb_buffer_set_language(HB_Buffer buffer, hb_language lagu);

    public struct hb_language
    {
        public IntPtr ptr;
    }
    [DllImport(dll_harffbuzz, CallingConvention = CallingConvention.Cdecl)]
    unsafe public static extern hb_language hb_language_from_string(byte* pstr, int len);
    public static string Version
    {
        get
        {
            unsafe
            {
                var v = hb_version_string();
                byte* bts = (byte*)v;
                List<byte> list = new List<byte>();
                for (var i = 0; i < 256; i++)
                {
                    if (bts[i] == 0)
                        break;
                    else
                        list.Add(bts[i]);

                }
                return System.Text.Encoding.UTF8.GetString(list.ToArray());
            }
        }
    }
}
